/**
 * 
 */
package co.com.sed.model.peers;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import co.com.sed.model.beans.Evaluacion360;
import co.com.sed.model.beans.Funcionario;
import co.com.sed.model.beans.Periodo;
import co.com.sed.model.util.Util;

/**
 * @author MBarros
 *
 */
public class Evaluacion360Peer {
	
	
	private static final String BUSCAR_TODAS_EVALUACIONES360 =
			"SELECT id_evaluacion_360, fecha_asig, estado, evaluado, periodo_evaluado, resultado "+
			"FROM evaluacion_360 ";
				
	private static final String BUSCAR_EVALUACIONES360_POR_FUNCIONARIO =
			"SELECT id_evaluacion_360, fecha_asig, estado, evaluado, periodo_evaluado, resultado "+
			"FROM evaluacion_360 "+
			"WHERE evaluado = &evaluado";
	
	private static final String BUSCAR_EVALUACIONES360_POR_PERIODO =
			"SELECT id_evaluacion_360, fecha_asig, estado, evaluado, periodo_evaluado, resultado "+
			"FROM evaluacion_360 "+
			"WHERE periodo_evaluado = &periodo_evaluado";
			
	private static final String BUSCAR_EVALUACION360 =
			"SELECT id_evaluacion_360, fecha_asig, estado, evaluado, periodo_evaluado, resultado "+
			"FROM evaluacion_360 "+
			"WHERE id_evaluacion_360 = &idevaluacion360";

	private static final String INSERTAR_EVALUACION360=
			"INSERT INTO evaluacion_360(fecha_asig, estado, evaluado, periodo_evaluado, resultado) VALUES "+
			"('&fecha_asig', '&estado', &evaluado, &periodo_evaluado, &resultado)";

	private static final String ACTUALIZAR_EVALUACION360 =
			"UPDATE evaluacion_360 "+
			"SET fecha_asig = &fecha_asig, estado = &estado, evaluado = &evaluado, periodo_evaluado=&periodo_evaluado, resultado = &resultado"+ 
			"WHERE id_evaluacion_360 = &id_evaluacion_360";

	private static final String ELIMINAR_EVALUACION360 =
			"DELETE FROM evaluacion_360 "+
			"WHERE id_evaluacion_360 = &id_evaluacion_360";

		/**
		 *  busca en la base de datos todos los registros de la tabla "Evaluacion360"
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
		 * 
		 * @return					lista de evaluacion_360s
		 * @see         			evaluacion_360, Statement
		 */

	public static ArrayList<Evaluacion360> buscarEvaluaciones360(Statement stmt) {
		ArrayList<Evaluacion360> Evaluaciones360 = new ArrayList<Evaluacion360>();
	
		String sql = BUSCAR_TODAS_EVALUACIONES360;
	
		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				while (rs.next()) {
					Evaluacion360 eva = new Evaluacion360();
					
					eva.setIdEvaluacion360(rs.getInt("id_evaluacion_360"));
					eva.setFechaAsignacion(rs.getDate("fecha_asig"));
					eva.setEstado(rs.getBoolean("estado"));
					eva.setResultado(rs.getFloat("resultado"));
					eva.setEvaluado(new Funcionario (rs.getInt("evaluado")));
					eva.setPeriodoEvaluado(new Periodo(rs.getInt("periodo_evaluado")));
								
					
					Evaluaciones360.add(eva);
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("No es posible consultar la base de datos:"
					+ e.getMessage());
			e.printStackTrace();
		}
	
		return Evaluaciones360;
	}
	
	
		/**
		 *  busca en la base de datos todos los registros de la tabla "evaluacion_360" que pertenescan a un funcionario
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
		 * 
		 * @return					lista de evaluaciones360
		 * @see        				Evaluacion360, Statement
		 */
	
	public static ArrayList<Evaluacion360> buscarEvaluaciones360PorFuncionario(Statement stmt, int identificacion) {
		ArrayList<Evaluacion360> evaluaciones360 = new ArrayList<Evaluacion360>();
	
		String sql = BUSCAR_EVALUACIONES360_POR_FUNCIONARIO;
		
		// se setean los "parametros"
		sql = sql.replaceAll("&evaluado", "" + identificacion);
	
		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				while (rs.next()) {
					Evaluacion360 eva = new Evaluacion360();
					
					eva.setIdEvaluacion360(rs.getInt("id_evaluacion_360"));
					eva.setFechaAsignacion(rs.getDate("fecha_asig"));
					eva.setEstado(rs.getBoolean("estado"));
					eva.setResultado(rs.getFloat("resultado"));
					eva.setEvaluado(new Funcionario (rs.getInt("evaluado")));
					eva.setPeriodoEvaluado(new Periodo(rs.getInt("periodo_evaluado")));
								
					
					evaluaciones360.add(eva);
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("No es posible consultar la base de datos:"
					+ e.getMessage());
			e.printStackTrace();
		}
	
		return evaluaciones360;
	}
	
	
		/**
		 *  busca en la base de datos todos los registros de la tabla "evaluacion_360" que pertenescan a un PERIODO
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
		 * 
		 * @return					lista de evaluaciones360
		 * @see        				Evaluacion360, Statement
		 */
	
	public static ArrayList<Evaluacion360> buscarEvaluaciones360PorPeriodo(Statement stmt, int idPeriodo) {
		ArrayList<Evaluacion360> evaluaciones360 = new ArrayList<Evaluacion360>();
	
		String sql = BUSCAR_EVALUACIONES360_POR_PERIODO;
		
		// se setean los "parametros"
		sql = sql.replaceAll("&periodoEvaluado", "" + idPeriodo);
	
		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				while (rs.next()) {
					Evaluacion360 eva = new Evaluacion360();
					
					eva.setIdEvaluacion360(rs.getInt("id_evaluacion_360"));
					eva.setFechaAsignacion(rs.getDate("fecha_asig"));
					eva.setEstado(rs.getBoolean("estado"));
					eva.setResultado(rs.getFloat("resultado"));
					eva.setEvaluado(new Funcionario (rs.getInt("evaluado")));
					eva.setPeriodoEvaluado(new Periodo(rs.getInt("periodo_evaluado")));
								
					
					evaluaciones360.add(eva);
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("No es posible consultar la base de datos:"
					+ e.getMessage());
			e.printStackTrace();
		}
	
		return evaluaciones360;
	}

		/**
		 *  busca en la base de datos un registro de la tabla "Evaluacion360"
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para realizar la consulta
		 * @param evaluacion360		id de la Evaluacion360 que se desea cosultar
		 * 
		 * @return					evaluacion_360 buscado
		 * @see        				evaluacion_360, Statement
		 */
	
	public static Evaluacion360 buscarEvaluacion360(Statement stmt, int idEvaluacion360) {
		Evaluacion360 eva = new Evaluacion360();
	
		String sql = BUSCAR_EVALUACION360;
		
		// se setean los "parametros"
		sql = sql.replaceAll("&idevaluacion360", ""+ idEvaluacion360);
		
		ResultSet rs;
		try {
			rs = stmt.executeQuery(sql);
			try {
				if (rs.next()) {
					eva.setIdEvaluacion360(rs.getInt("id_evaluacion_360"));
					eva.setFechaAsignacion(rs.getDate("fecha_asig"));
					eva.setEstado(rs.getBoolean("estado"));
					eva.setResultado(rs.getFloat("resultado"));
					eva.setEvaluado(new Funcionario (rs.getInt("evaluado")));
					eva.setPeriodoEvaluado(new Periodo(rs.getInt("periodo_evaluado")));					
					
				}
			} finally {
				rs.close();
			}
		} catch (SQLException e) {
			Util.print("No es posible consultar la base de datos:" + e.getMessage());
			e.printStackTrace();
		}
	
		return eva;
	}


		/**
		 *  Inserta un Tipo de Evaluacion360 en la base de datos
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
		 * @param evaluacion360		evaluacion360 que se va a insertar en la base de datos
		 * 
		 * @return					void
		 * @throws SQLException		si ocurre un error al insertar el registro en la base de datos
		 * 
		 * @see         			DataManager
		 */
	
	public static int insertarEvaluacion360(Statement stmt, Evaluacion360 evaluacion360) throws SQLException {
		int idNuevaEvaluacion360 = -1;
		ResultSet rs = null;
		
		try {
			String sql = INSERTAR_EVALUACION360;
			 //se setean los "parametros": &id_calificacion, &cualitativa, &cuantitativa, &descripcion 
			sql = sql.replaceAll("&fecha_asig", "" + evaluacion360.getFechaAsignacion())	
					 .replaceAll("&estado", ""+ evaluacion360.getEstado())
					 .replaceAll("&resultado", ""+ evaluacion360.getResultado())
					 .replaceAll("&evaluado", ""+ evaluacion360.getEvaluado().getIdFuncionario())				 
					 .replaceAll("&periodo_evaluado",  ""+ evaluacion360.getPeriodoEvaluado().getIdPeriodo());
			
			
			stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS);
			
			rs = stmt.getGeneratedKeys();
			
			if (rs.next()) {
				idNuevaEvaluacion360 = rs.getInt("id_evaluacion_360");
				Util.print("nuevo registro: " + idNuevaEvaluacion360);
			}
		} finally {
			rs.close();
		}
		
		return idNuevaEvaluacion360;
	}

	

		/**
		 *  Actualiza un evaluacion_360 en la base de datos
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
		 * @param evaluacion360		evaluacion360 que se va a actualizar en la base de datos
		 * 
		 * @return					void
		 * @throws SQLException		si ocurre un error al actualizar el registro en la base de datos
		 * 
		 * @see         			DataManager
		 */
	
	public static void actualizarEvaluacion360(Statement stmt, Evaluacion360 evaluacion360) throws SQLException {
		String sql = ACTUALIZAR_EVALUACION360;
		// se setean los "parametros": &id_evaluacion_360, &fecha_asig, &estado, &identificacion, &periodo_evaluado
		sql = sql.replaceAll("&id_evaluacion_360", ""+ evaluacion360.getIdEvaluacion360())
				 .replaceAll("&fecha_asig", Util.sqlFormatDate(evaluacion360.getFechaAsignacion())	
				 .replaceAll("&estado", ""+evaluacion360.getEstado())
				 .replaceAll("&identificacion", ""+evaluacion360.getEvaluado().getIdentificacion())				 
				 .replaceAll("&periodo_evaluado",  ""+evaluacion360.getPeriodoEvaluado()));
		
		stmt.executeUpdate(sql);
	}

		/**
		 *  Elimina un evaluacion_360 en la base de datos
		 * 
		 * @param stmt				referencia al Statement, pasado por DataManager para ejecutar la sentencia
		 * @param evaluacion360		evaluacion360 que se va a eliminar en la base de datos
		 * 
		 * @return					void
		 * @throws SQLException		si ocurre un error al eliminar el registro en la base de datos
		 * 
		 * @see         			DataManager
		 */
	
	public static void eliminarEvaluacion360(Statement stmt, Evaluacion360 evaluacion360) throws SQLException {
		String sql = ELIMINAR_EVALUACION360;
		// se setean los "parametros": &id_evaluacion_360
		sql = sql.replaceAll("&id_evaluacion_360", "" + evaluacion360.getIdEvaluacion360());
	
		stmt.executeUpdate(sql);
	}

}
